/*

This file is part of roomyak.

Copyright (C) 2008 Pixecur Technologies Incorporated (Esotera).
Visit Esotera at http://www.esoteras3.com
 
roomyak is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
 
roomyak is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with roomyak; see the file COPYING.  If not, write to 
Pixecur Technologies, 213-31 Peet Street, St. John's, NL, A1B 3W8. 
 
Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
 
*/

package com.datasentinel.util.collections;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class ReadOnlyCollections
{

	public static<E> ReadOnlyList<E> asReadOnlyList(List<E> list)
	{
		return new ReadOnlyArrayList<E>(list);
	}

	public static<E> ReadOnlyList<E> asReadOnlyListWrapper(List<E> list)
	{
		return new ReadOnlyArrayList<E>(list);
	}
	
	public static<E> ReadOnlyList<E> asReadOnlyList(Collection<E> collection)
	{
		return new ReadOnlyArrayList<E>(new ArrayList<E> (collection));
	}
	
	public static<E> Iterator<E> asIterator(final ReadOnlyIterator<E> readOnlyIterator)
	{
		if(readOnlyIterator instanceof ReadOnlyIteratorImpl<?>)
		{
			return (ReadOnlyIteratorImpl<E>)readOnlyIterator;
		}
		
		return new Iterator<E>(){
			@Override
			public boolean hasNext()
			{
				return readOnlyIterator.hasNext();
			}
			
			@Override
			public E next()
			{
				return readOnlyIterator.next();
			}
			
			@Override
			public void remove()
			{
				throw new UnsupportedOperationException("Read/Only iterator does not support removing.");
			}
		};
	}
	
}
